package com.demo.base.template;

/**
 * @author : YU.TAN
 * @date : 2021/10/28 15:07
 * 模板方法模式
 * 定义一个操作中的算法的骨架流程，而将一些步骤延迟到子类中，
 * 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
 * 它的核心思想就是：定义一个操作的一系列步骤，对于某些暂时确定不下来的步骤，就留给子类去实现，这样不同的子类就可以定义出不同的步骤。
 * <p>
 * 模板方法使用
 * 一个抽象类，定义骨架流程（抽象方法放一起）
 * 确定的共同方法步骤，放到抽象类（去除抽象方法标记）
 * 不确定的步骤，给子类去差异化实现
 */
public abstract class AbstractMerchantService {

    /**
     * 例如：
     * 个个请求经过的流程为一下步骤：
     * 查询商户信息
     * 对请求报文加签
     * 发送http请求出去
     * 对返回的报文验签
     */

    /**
     * 抽象类定义骨架流程（查询商户信息，加签，http请求，验签）
     */


    /**
     * 查询商户信息
     */
    String queryMerchantInfo(String parms) {
return parms+"+查询商户信息";
    }

    /**
     * 加签
     */
    String signature(String parms) {
        return parms+"+加签";

    }

    /**
     * http请求
     */
    String httpRequest(String parms) {
        return parms+"+http请求";
    }

    /**
     * 验签
     */
    String verifySinature(String parms) {
        return parms+"+验签";
    }

    /**
     * 模板方法流程
     *
     * @param parms
     */
    public String handlerTempPlate(String parms) {
        String merchantInfo = queryMerchantInfo(parms);
        String signature = signature(merchantInfo);
        String request = httpRequest(signature);
        return verifySinature(request);
    }


    /**
     * Http是否走代理（提供给子类实现）
     *
     * @return
     */
    public abstract boolean isRequestByProxy();

}
